package edu.algo3.algoThief.domain;

import java.util.ArrayList;
import java.util.Iterator;

import edu.algo3.algoThief.dao.Repositorio;
import edu.algo3.algoThief.util.Constants;

public class OrdenDeArresto {

    // Variables : estas variables son las caracteristicas del Ladron que el jugador piensa conocer.

    private ArrayList<Ladron> listaDeTodosLosSospechosos;
    private ArrayList<Ladron> listaDeSospechosos;

    private boolean fueEmitida = Boolean.FALSE;

    private String apellido;

    private String sexo;

    private String cabello;

    private String senia;

    private String vehiculo;

    private String hobby;

    public OrdenDeArresto() {

        this.apellido = Constants.VACIO;
        this.sexo = Constants.VACIO;
        this.cabello = Constants.VACIO;
        this.senia = Constants.VACIO;
        this.vehiculo = Constants.VACIO;
        this.hobby = Constants.VACIO;
        this.listaDeTodosLosSospechosos = definirListaDeSospechosos();
        this.listaDeSospechosos = definirListaDeSospechosos();
    }

    public OrdenDeArresto(String jugadorNombre) {

        this.apellido = Repositorio.cargarOrdenDeArrestoApellido(jugadorNombre);
        this.sexo = Repositorio.cargarOrdenDeArrestoSexo(jugadorNombre);
        this.cabello = Repositorio.cargarOrdenDeArrestoCabello(jugadorNombre);
        this.senia = Repositorio.cargarOrdenDeArrestoSenia(jugadorNombre);
        this.vehiculo = Repositorio.cargarOrdenDeArrestoVehiculo(jugadorNombre);
        this.hobby = Repositorio.cargarOrdenDeArrestoHobby(jugadorNombre);
        this.listaDeSospechosos = definirListaDeSospechosos();
        this.listaDeTodosLosSospechosos = definirListaDeSospechosos();
    }

    // getters

    public String getApellido() {

        return apellido;
    }

    public String getSexo() {

        return sexo;
    }

    public String getCabello() {

        return cabello;
    }

    public String getSenia() {

        return senia;
    }

    public String getVehiculo() {

        return vehiculo;
    }

    public String getHobby() {

        return hobby;
    }

    // setters

    public void setApellido(String nuevoApellido) {

        apellido = nuevoApellido;
    } // ! NB : apellido unicamente se setea via la emision de un orden de arresto

    public void setSexo(String nuevoSexo) {

        sexo = nuevoSexo;
        actualizaListaDeSospechosos();
    }

    public void setCabello(String nuevoCabello) {

        cabello = nuevoCabello;
        actualizaListaDeSospechosos();
    }

    public void setSenia(String nuevoSenia) {

        senia = nuevoSenia;
        actualizaListaDeSospechosos();
    }

    public void setVehiculo(String nuevoVehiculo) {

        vehiculo = nuevoVehiculo;
        actualizaListaDeSospechosos();
    }

    public void setHobby(String nuevoHobby) {

        hobby = nuevoHobby;
        actualizaListaDeSospechosos();
    }

    public boolean fueEmitida() {

        return fueEmitida;
    }

    public void setFueEmitida(boolean fueEmitida) {

        this.fueEmitida = fueEmitida;
    }

    public ArrayList<Ladron> getListaDeSospechosos() {

        return listaDeSospechosos;
    }

    
    public ArrayList<Ladron> getListaDeTodosLosSospechosos() {
    
        return listaDeTodosLosSospechosos;
    }

    private ArrayList<Ladron> definirListaDeSospechosos() {

        listaDeSospechosos = new ArrayList<Ladron>();
        ArrayList<String> listaDeApellidos =
            Repositorio.getSospechososApellidos();

        Iterator<String> i = listaDeApellidos.iterator();
        while (i.hasNext()) {
            Ladron ladron = new Ladron(i.next());
            listaDeSospechosos.add(ladron);
        }

        return listaDeSospechosos;
    }

    // metodos

    public void actualizaListaDeSospechosos() {

        ArrayList<Ladron> nuevaListaDeSospechosos = new ArrayList<Ladron>();

        Iterator<Ladron> i = this.listaDeTodosLosSospechosos.iterator();
        while (i.hasNext()) {
            Boolean sospechoEsValido = Boolean.TRUE;
            Ladron posibleLadron = i.next();

            if (!Constants.VACIO.equals(this.sexo)
                && !this.sexo.equals(posibleLadron.getCaracteristicas()
                    .getSexo())) {
                sospechoEsValido = Boolean.FALSE;
            }

            if (!Constants.VACIO.equals(this.cabello)
                && !this.cabello.equals(posibleLadron.getCaracteristicas()
                    .getCabello())) {
                sospechoEsValido = Boolean.FALSE;
            }

            if (!Constants.VACIO.equals(this.senia)
                && !this.senia.equals(posibleLadron.getCaracteristicas()
                    .getSenia())) {
                sospechoEsValido = Boolean.FALSE;
            }

            if (!Constants.VACIO.equals(this.vehiculo)
                && !this.vehiculo.equals(posibleLadron.getCaracteristicas()
                    .getVehiculo())) {
                sospechoEsValido = Boolean.FALSE;
            }

            if (!Constants.VACIO.equals(this.hobby)
                && !this.hobby.equals(posibleLadron.getCaracteristicas()
                    .getHobby())) {
                sospechoEsValido = Boolean.FALSE;
            }

            if (sospechoEsValido) {
                nuevaListaDeSospechosos.add(posibleLadron);
            }
        }

        this.listaDeSospechosos = nuevaListaDeSospechosos;
    }

    public String[] getArrayDeSospechosos() {

        String[] arrayDeSospechosos = new String[this.listaDeSospechosos.size()];
        int contador = 0;
        for (Ladron ladron : this.listaDeSospechosos) {
            arrayDeSospechosos[contador] = ladron.getApellido();
            contador++;
        }
        return arrayDeSospechosos;
    }

    // ------------------

    /*
     * CaracteristicasLadron caracteristicasLadron; public List<Ladron> getListaDeSospechosos() {
     * return listaDeSospechosos; } public void setListaDeSospechosos(List<Ladron>
     * listaDeSospechosos) { this.listaDeSospechosos = listaDeSospechosos; } public
     * CaracteristicasLadron getCaracteristicasLadron() { return caracteristicasLadron; } public
     * void setCaracteristicasLadron(CaracteristicasLadron caracteristicasLadron) {
     * this.caracteristicasLadron = caracteristicasLadron; }
     */

}
